Apache Hadoop 的学习
Hadoop的基本概念
Hadoop是一种开源框架,用于高效存储和处理从 GB 级到 PB 级的大型数据集。利用 Hadoop,可以将多台计算机组成集群以便更快地并行分析海量数据集,而不是使用一台大型计算机来存储和处理数据。
Hadoop的四个主要组件
HDFS
hdfs(全称:Hadoop distribution file system),它负责整个hadoop集群的存储,提供了比传统文件系统更高性能高可用的存储方案
MapReduce
MapReduce则是负责在hadoop集群中,并行计算分析数据的工具。Map 任务会提取输入数据,转换成能采用键值对形式对其进行计算的数据集。Reduce 任务会使用 Map 任务的输出来对输出进行汇总,并提供所需的结果
YARN
yarn(全称:Yet Another Resource Negotiator),它负责管理与监控集群节点和资源使用情况。它会对作业和任务进行安排。
Hadoop Common
提供可在所有模块上使用的常见 Java 库
在Hadoop中,最为核心的就是HDFS和MapReduce,它们分别负责了整个Hadoop的存储和运算,本文也为着重介绍这两个部分
HDFS
为什么会有HDFS?
hdfs被设计出来的目的就是在大量廉价机器上,提供可靠、高吞吐地存储和读取超大规模文件。正是因为选择了高可用和高吞吐,因此HDFS也放弃了事务的支持,它的随机读写的能力也很差。
HDFS 的主要组成
Client
HDFS Client 是嵌入在应用进程中的访问库,负责与 NameNode 交互元数据,并直接与 DataNode 建立数据通道,从而实现去中心化、高吞吐的数据访问模型。可以这么理解,HDFS Client就是Java代码库中连接数据库的JDBC
NameNode
NameNode是元数据管理者,维护着从文件到块;块到DataNode的映射。它只存储元数据,不存储实际的文件数据。NameNode是一种内存型的服务,并且通过 Active/StandBy机制(内存中同时有一个NameNode副本,一旦不可用就立马替代)来实现高可用
DataNode
DataNode存储真实的 Block,并且DataNode需要定期向 NameNode 汇报心跳和Block 状态,同时负责最终的数据读写,校验和副本复制。
HDFS的读流程
HDFS的读取核心思想就是:Client直接从NameNode中获取到DataNode的位置,然后直接从DataNode读取数据。

如上图所示,就是一个完整的HDFS的读取的流程。可以看到HDFS的高吞吐和高可用的特性,而这种读取的方式,就决定了在随机读取的性能不高。
HDFS的写流程
HDFS的写入核心思想就是:Client一次写入,使用顺序追加的方式来提高写入的效率,不支持随机写。而副本之间的复制,则通过pipeline的技术,DataNode一边写入一边转发数据到副本DataNode

HDFS是怎么保证高吞吐,一致性以及高可用的?
高吞吐:
- 采用append-log的方式进行顺序写入,来避免随机写入影响到IO性能
- HDFS中块的默认大小是128MB,尽可能的减少磁盘寻块以及访问元数据次数
- 采用Pipeline的方式并行写入副本,而不是串行写入
- Client可以直接连接到DataNode去写入,避免了不必要的元数据访问开销
一致性:HDFS保证的是最终一致性
- 一个DataNode只能被一个NameNode所管理,单写能避免很多的一致性问题(CAP理论)
- 使用pipeline 和 ack 来保证强一致的副本写入。只有所有的DN返回ack之后,才确认这个packet写入成功。
高可用:
- 多副本机制,同一份内容,最少在三个DN中进行备份
- 针对DN和NN设有心跳机制,一旦出现故障立马进行自愈
- 强一致的副本写入机制,保证读的时候,不会出现不同的DN数据不一致的情况
MapReduce
什么是MapReduce?
MapReduce 是一种用于在大规模分布式集群上进行离线批处理的编程模型和执行框架,其核心思想是:把对海量数据的计算拆成两个确定性阶段:Map(映射) 和 Reduce(归约)。

MapReduce的基本流程
Input & Split(数据切分)
输入数据通常存储在 HDFS,MapReduce 框架会按 HDFS block进行逻辑切分。注意这里是逻辑切分,并不涉及实际的磁盘读取操作。为了保证效率,MapTask尽量被调度到其数据所在的DataNode上去执行
Map(局部计算)
每个 Map Task 顺序读取自己的数据分片,对每一条记录执行用户定义的映射逻辑,将原始输入转换为一组中间键值对。Map 阶段不维护任何全局状态,各任务之间完全独立,其输出结果通常先缓存在内存中,再溢写到本地磁盘,为后续阶段做准备。
Shuffle(重新划分)
Shuffle 是连接 Map 与 Reduce 的中间过程。该阶段按照中间结果的 key 进行分区、排序和跨节点传输,确保相同 key 的数据被汇聚到同一个 Reduce Task。具体来说,Reducer 会从所有 Mapper 拉取属于自己分区的数据,对这些数据进行归并和排序,最终形成按 key 分组的有序输入。Shuffle 通常涉及大量网络和磁盘 I/O,是 MapReduce 中最关键、也是最昂贵的阶段。(必须要有shuffle,保证Reduce执行时能看见同一个 key 的全部数据)
Reduce(规约)
Reduce 阶段负责对 Shuffle 后得到的分组数据进行聚合或归约处理。框架保证 Reduce Task 接收到的输入是按 key 排序的,并且同一 key 对应的所有 value 会连续出现。Reduce 函数以 key 及其对应的 value 集合为输入,执行用户定义的聚合逻辑,生成最终结果。Reduce 的输出通常会顺序写入分布式文件系统,作为整个 MapReduce 作业的最终产出。
MapReduce 的优点
- 可拓展性强:将复杂的任务拆解为互相独立的map和reduce任务,使得在处理各种量级的数据都能得心应手
- 容错机制简单而可靠:每个阶段都有明确的边界,并且数据都会落盘,一旦失败就重新跑一遍任务就好了
- 适合离线批处理和全量计算:MapReduce非常适合离线的大量批数据处理,由于采用了顺序读,其对磁盘的IO利用也很好
MapReduce的缺点
- 作业延迟高,不适合交互式或实时计算:MapReduce的每个阶段都要落盘,因此导致要花费大量的时间在磁盘的IO上
- Shuffle 成本高,容易成为性能瓶颈:Shuffle需要跨节点拉取数据,排序和合并中间数据。当出现数据倾斜的时候,很容易拖慢整个任务的效率
- 不支持高效的迭代和复杂计算模式:每次执行mapreduce任务,都要从磁盘中读取,对于机器学习、图计算等需要多轮迭代的算法,这种方式十分的低效
总结
从上面的介绍可以知道,Hadoop是运行在本地的服务器之上的,并且在Hadoop的基础之上,发展出了HBase,Hive等一系列的拓展生态。随着云原生的发展,更为方便的对象存储,以及云原生与生俱来的高伸缩和自托管性,以及流式处理数据的需要,使得Hadoop开始逐渐的退出了历史舞台。但是学习Hadoop的基本组成和发展对于学习者来说还是很有必要的。
Apache Hadoop 的学习
https://kosa-as.github.io/2026/01/05/infrastructure/Apache Hadoop/